/*
 * Copyright 2022 Google LLC
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include "include/core/SkPathUtils.h"

#include "include/core/SkMatrix.h"
#include "include/core/SkPaint.h"
#include "include/core/SkPath.h"
#include "include/core/SkPathEffect.h"
#include "include/core/SkStrokeRec.h"
#include "src/core/SkMatrixPriv.h"

namespace skpathutils {

bool FillPathWithPaint(const SkPath& src, const SkPaint& paint, SkPath* dst) {
    return skpathutils::FillPathWithPaint(src, paint, dst, nullptr, 1);
}

bool FillPathWithPaint(const SkPath& src, const SkPaint& paint, SkPath* dst,
                       const SkRect* cullRect, SkScalar resScale) {
    return skpathutils::FillPathWithPaint(src, paint, dst, cullRect,
                                          SkMatrix::Scale(resScale, resScale));
}

bool FillPathWithPaint(const SkPath& src, const SkPaint& paint, SkPath* dst,
                       const SkRect* cullRect, const SkMatrix& ctm) {
    // @todo
    return false;
//     if (!src.isFinite()) {
//         dst->reset();
//         return false;
//     }
//
//     const SkScalar resScale = SkMatrixPriv::ComputeResScaleForStroking(ctm);
//     SkStrokeRec rec(paint, resScale);
//
// #if defined(SK_BUILD_FOR_FUZZER)
//     // Prevent lines with small widths from timing out.
//     if (rec.getStyle() == SkStrokeRec::Style::kStroke_Style && rec.getWidth() < 0.001) {
//         return false;
//     }
// #endif
//
//     const SkPath* srcPtr = &src;
//     SkPath tmpPath;
//
//     SkPathEffect* pe = paint.getPathEffect();
//     if (pe && pe->filterPath(&tmpPath, src, &rec, cullRect, ctm)) {
//         srcPtr = &tmpPath;
//     }
//
//     if (!rec.applyToPath(dst, *srcPtr)) {
//         if (srcPtr == &tmpPath) {
//             // If path's were copy-on-write, this trick would not be needed.
//             // As it is, we want to save making a deep-copy from tmpPath -> dst
//             // since we know we're just going to delete tmpPath when we return,
//             // so the swap saves that copy.
//             dst->swap(tmpPath);
//         } else {
//             *dst = *srcPtr;
//         }
//     }
//
//     if (!dst->isFinite()) {
//         dst->reset();
//         return false;
//     }
//     return !rec.isHairlineStyle();
}

} // namespace skpathutils

SK_API bool FillPathWithPaint(const SkPath &src, const SkPaint &paint, SkPath *dst,
                              const SkRect *cullRect, SkScalar resScale) {
    return skpathutils::FillPathWithPaint(src, paint, dst, cullRect, resScale);
}

SK_API bool FillPathWithPaint(const SkPath &src, const SkPaint &paint, SkPath *dst,
                              const SkRect *cullRect, const SkMatrix &ctm) {
    return skpathutils::FillPathWithPaint(src, paint, dst, cullRect, ctm);
}

SK_API bool FillPathWithPaint(const SkPath &src, const SkPaint &paint, SkPath *dst) {
    return skpathutils::FillPathWithPaint(src, paint, dst);
}
